package com.xframe.xdal.core.util.redis.command;

import com.xframe.xdal.core.util.StringUtil;
import com.xframe.xdal.core.util.redis.pool.IRedisPool;
import redis.clients.jedis.commands.JedisCommands;
import redis.clients.jedis.commands.MultiKeyCommands;

public class KeyCommand {



    private IRedisPool pool = null;

    public KeyCommand(IRedisPool pool){
        this.pool = pool;
    }
    /**
     * 以秒为单位，返回给定 key 的剩余生存时间(TTL, time to live)。
     *
     * @param key   key
     *
     * @return 当 key 不存在时，返回 -2 。 当 key 存在但没有设置剩余生存时间时，返回 -1 。否则，以秒为单位，返回 key 的剩余生存时间。
     */
    public Long ttl(String key) {
        if (StringUtil.isValueNull(key)) {
            return -2L;
        }
        JedisCommands client = pool.getClient();
        try {
            return client.ttl(key);
        } finally {
            pool.close(client);
        }
    }
    /**
     * 以毫秒为单位，返回给定 key 的剩余生存时间(TTL, time to live)。
     *
     * @param key   key
     *
     * @return 当 key 不存在时，返回 -2 。 当 key 存在但没有设置剩余生存时间时，返回 -1 。否则，以毫秒为单位，返回 key 的剩余生存时间。
     */
    public Long pttl(String key) {
        if (StringUtil.isValueNull(key)) {
            return -2L;
        }
        JedisCommands client = pool.getClient();
        try {
            return client.pttl(key);
        } finally {
            pool.close(client);
        }
    }
    /**
     * 删除给定的一个 key 不存在的 key 会被忽略。
     *
     * @param key   key
     *
     * @return 被删除 key 的数量
     */
    public Long del(String key){
        if (StringUtil.isValueNull(key)) {
            return 0L;
        }
        JedisCommands client = pool.getClient();
        try {
            return client.del(key);
        } finally {
            pool.close(client);
        }
    }

    /**
     * 删除给定的一个 key 不存在的 key 会被忽略。
     *
     * @param keys   key
     *
     * @return 被删除 key 的数量
     */
    public Long del(String... keys){
        if (StringUtil.isValueNull(keys)) {
            return 0L;
        }
        MultiKeyCommands client = pool.getMultiKeyCommands();
        if(client == null){
            return -1L;
        }
        try {
            return client.del(keys);
        } finally {
            pool.close(client);
        }
    }

    /**
     * 检查给定 key 是否存在。
     *
     * @param key   key
     *
     * @return 若 key 存在，返回 1 ，否则返回 0 。
     */
    public Boolean exists(String key){
        if (StringUtil.isValueNull(key)) {
            return false;
        }
        JedisCommands client = pool.getClient();
        try {
            return client.exists(key);
        } finally {
            pool.close(client);
        }
    }


    /**
     * 为给定 key 设置生存时间，当 key 过期时(生存时间为 0 )，它会被自动删除。
     * 可以对一个已经带有生存时间的 key 执行 EXPIRE 命令，新指定的生存时间会取代旧的生存时间
     *
     * @param key  key
     * @param ttl 秒为单位的周期
     *
     * @return 设置成功返回 1 。
     * 当 key 不存在或者不能为 key 设置生存时间时(比如在低于 2.1.3 版本的 Redis 中你尝试更新 key 的生存时间)，返回 0
     */
    public Long expire(String key,int ttl){
        if (StringUtil.isValueNull(key)) {
            return 0L;
        }
        JedisCommands client = pool.getClient();
        try {
            return client.expire(key,ttl);
        } finally {
            pool.close(client);
        }
    }

    /**
     * 为给定 key 设置生存时间，毫秒
     *
     * @param key  key
     * @param ttl 毫秒为单位的周期
     *
     * @return 设置成功返回 1 。
     * 当 key 不存在或者不能为 key 设置生存时间，返回 0
     */
    public Long pexpire(String key,Long ttl){
        if (StringUtil.isValueNull(key)) {
            return 0L;
        }
        JedisCommands client = pool.getClient();
        try {
            return client.pexpire(key,ttl);
        } finally {
            pool.close(client);
        }
    }

    /**
     * 为给定 key 设置生存时间，当 key 过期时(生存时间为 0 )，它会被自动删除。
     *
     *
     * @param key  key
     * @param ttl 时间戳
     *
     * @return 设置成功返回 1，当 key 不存在或者不能为 key 设置生存时间返回 0
     */
    public Long expireAt(String key,Long ttl){
        if (StringUtil.isValueNull(key)) {
            return 0L;
        }
        JedisCommands client = pool.getClient();
        try {
            return client.expireAt(key,ttl);
        } finally {
            pool.close(client);
        }
    }


    /**
     * 移除给定 key 的生存时间，将这个 key 从『易失的』(带生存时间 key )转换成『持久的』(一个不带生存时间、永不过期的 key )。
     *
     *
     * @param key  key
     *
     * @return 设置成功返回 1，当 key 不存在或者不能为 key 设置生存时间返回 0
     */
    public Long persist(String key){
        if (StringUtil.isValueNull(key)) {
            return 0L;
        }
        JedisCommands client = pool.getClient();
        try {
            return client.persist(key);
        } finally {
            pool.close(client);
        }
    }



}
